package com.sgb.goods.utils.base.adapter;

import android.view.View;
import android.view.ViewGroup;

import androidx.annotation.Nullable;

import com.chad.library.adapter.base.BaseQuickAdapter;
import com.chad.library.adapter.base.BaseViewHolder;
import com.sgb.goods.entity.RecordPointEntity;

import org.jetbrains.annotations.NotNull;

import java.util.List;

/**
 * RecycleView公用适配器 结合dataBinding
 * 适用对象：带记录点的公用适配器，一般用于弹窗选择网络列表数据
 * @author cyj
 * @param <T>
 */
public abstract class RecordPointCommonAdapter<T extends RecordPointEntity> extends BaseCommonAdapter<T> implements BaseQuickAdapter.OnItemClickListener {

    /** 上一次当前选中的那个item，这个对象用于首次或者进来选中一个非记录的对象后点取消，下次进入对应不上真实的对象标记 */
    public T oldObj;
    /** 当前选中的那个item */
    public T currentObj;
    /** 当前对象里是另外一个集合时，当前层级对应的下级列表选择的 position */
    public int oldPosition = -1;
    public int position = -1;
    /** 是否选中第一个作为默认项，假设从未选中过任何一项或者第一次初始化 */
    private boolean isSelectIndex0;
    private BaseQuickAdapter.OnItemClickListener listener;

    public RecordPointCommonAdapter(int layoutResId) {
        super(layoutResId);
    }

    public RecordPointCommonAdapter(int layoutResId, int variableId) {
        super(layoutResId, variableId);
    }

    public RecordPointCommonAdapter(int layoutResId, List<T> list, int variableId) {
        super(layoutResId, list, variableId);
    }

    @Override
    public @NotNull BaseViewHolder onCreateViewHolder(ViewGroup parent, int viewType) {
        super.setOnItemClickListener(this);
        return super.onCreateViewHolder(parent, viewType);
    }

    @Override
    public void onItemClick(BaseQuickAdapter adapter, View view, int position) {

        // 先隐藏在显示。注意：此处无法跨列表处操作其他列表选中的项，需要自行在子类处理
        if(null != this.currentObj) {
            this.currentObj.isSelectIt.set(false);
        }
        this.position = position;
        this.currentObj = getData().get(position);
        this.currentObj.isSelectIt.set(true);

        if(null != listener) {
            listener.onItemClick(adapter, view, position);
        }
    }

    /**
     * @see this#setItemClickListener(OnItemClickListener)
     * @param listener
     */
    @Deprecated
    @Override
    public void setOnItemClickListener(BaseQuickAdapter.OnItemClickListener listener) {
        super.setOnItemClickListener(listener);
    }

    public void setItemClickListener(BaseQuickAdapter.OnItemClickListener listener) {
        this.listener = listener;
    }

    /**
     * 等效对象条件。
     * 判断两个对象是否等效一致，根据不同业务由子类来实现，判断两个对象是否一致的条件一般的可能是id等等
     *
     * @param object1    对象1
     * @param object2    对象2
     * @return           boolean true：对象相同；false：对象不相同；默认false
     */
    public abstract boolean equivalentToObject(T object1, T object2);

    /**
     * 设置记录点的函数。
     * 该 adapter 在数据填充时实现自动选中历史某个历史item；适用于一级或者多级列表
     * @param obj    选中的那个item对象
     */
    public void setRecordPoint(T obj) {
        if(null == obj) {
            return;
        }
        // 指定
        for (T entity : getData()) {
            if(equivalentToObject(entity, obj)) {
                entity.isSelectIt.set(true);
                this.currentObj = entity;
                this.oldObj = entity;
                // 自动滚动到目标处，若 Position 为-1则不滚动
                if(null != getRecyclerView()) {
                    getRecyclerView().scrollToPosition(oldPosition);
                }
                break;
            }
        }
    }

    /**
     * 设置记录点（外部干预函数）
     * 当你需要记录历史选中对象时，调用此函数，下次进入时可自动选中上次设置的记录点
     */
    public void setRecordPoint() {
        this.oldObj = this.currentObj;
        this.oldPosition = this.position;
    }

    /**
     * 取消记录点（外部干预函数）
     * 当你需要取消记录历史选中对象时，调用此函数，下次进入时不会因为上次点击的任何一项而改变历史选项，
     * 他的值是永远是 {@link this#setRecordPoint()}或者是null
     */
    public void cancelRecordPoint() {
        if(null == this.oldObj || null == this.currentObj) {
            this.currentObj = null;
            this.position = -1;
        } else {
            this.oldObj.isSelectIt.set(true);
            this.currentObj = this.oldObj;
            this.position = this.oldPosition;
        }
    }

    @Override
    public void setNewData(@Nullable @org.jetbrains.annotations.Nullable List<T> data) {
        super.setNewData(data);
        // 判断是否默认选中第一项为默认项，默认是 false
        if(isSelectIndex0 && null == oldObj && getData().size() > 1) {
            setRecordPoint(getData().get(0));
        }
    }

    /**
     * 是否默认选中第一项作为默认项
     * @param isSelectIndex0    选中第1个，假设数据大于1
     */
    public void setDefaultItem(boolean isSelectIndex0) {
        this.isSelectIndex0 = isSelectIndex0;
    }

    public void reset(boolean isResetAll) {
        // 重设状态
        if(null != this.currentObj) {
            this.currentObj.isSelectIt.set(false);
        }
        if(isResetAll) {
            this.currentObj = null;
            this.oldObj = null;
            this.position = -1;
            this.oldPosition = -1;
        }
    }
}
